package com.stt.videoprocess.design.state.impl;


import com.stt.videoprocess.design.model.ProcessingStatus;
import com.stt.videoprocess.design.model.VideoTask;
import com.stt.videoprocess.design.state.VideoProcessingState;
import lombok.extern.slf4j.Slf4j;

/**
 * 处理中状态实现类
 * 功能：
 * 1. 处理暂停/恢复操作
 * 2. 监控超时自动暂停
 * 3. 异常自动转换为失败状态
 */
@Slf4j
public class ProcessingState implements VideoProcessingState {

    /**
     * 处理视频任务时覆盖默认行为
     * 当进入处理中状态时，启动超时监控机制
     *
     * @param task 待处理的视频任务对象
     */
    @Override
    public void handle(VideoTask task) {
        log.info("任务开始处理===》");
        // 状态进入时启动超时监控
        startTimeoutMonitor(task);
    }

    /**
     * 尝试从处理中状态开始处理视频任务
     * 抛出非法状态异常，因为任务已经在处理中
     *
     * @param task 视频任务对象
     * @return 无返回值，因为抛出异常
     */
    @Override
    public VideoProcessingState startProcessing(VideoTask task) {
        throw new IllegalStateException("任务已经在处理中");
    }

    /**
     * 暂停正在处理中的视频任务
     * 更新任务状态为暂停，并返回暂停状态对象
     *
     * @param task 视频任务对象
     * @return 返回暂停状态对象
     */
    @Override
    public VideoProcessingState pauseProcessing(VideoTask task) {
        task.setStatus(ProcessingStatus.PAUSED);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new PausedState();
    }

    /**
     * 尝试从处理中状态恢复视频任务
     * 抛出非法状态异常，因为不允许从处理中状态直接恢复
     *
     * @param task 视频任务对象
     * @return 无返回值，因为抛出异常
     */
    @Override
    public VideoProcessingState resumeProcessing(VideoTask task) {
        throw new IllegalStateException("无法从处理中状态恢复任务");
    }

    /**
     * 完成正在处理中的视频任务
     * 更新任务状态为完成，并返回完成状态对象
     *
     * @param task 视频任务对象
     * @return 返回完成状态对象
     */
    @Override
    public VideoProcessingState completeProcessing(VideoTask task) {
        task.setStatus(ProcessingStatus.COMPLETED);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new CompletedState();
    }

    /**
     * 处理视频任务失败
     * 更新任务状态为失败，记录错误信息，并返回失败状态对象
     *
     * @param task 视频任务对象
     * @param errorMessage 错误信息
     * @return 返回失败状态对象
     */
    @Override
    public VideoProcessingState failProcessing(VideoTask task, String errorMessage) {
        task.setStatus(ProcessingStatus.FAILED);
        task.setErrorMessage(errorMessage);
        task.setUpdateTime(java.time.LocalDateTime.now());
        return new FailedState();
    }

    /**
     * 启动一个超时监控线程来监视视频任务的处理
     * 如果任务在30秒内没有完成，将其状态改为暂停
     *
     * @param task 需要监控的视频任务对象
     */
    private void startTimeoutMonitor(VideoTask task) {
        // 启动超时监控线程
        new Thread(() -> {
            try {
                Thread.sleep(30000); // 30秒超时
                if (task.getState() instanceof ProcessingState) {
                    pauseProcessing(task);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}
